/**
 * 文件名称:  BaseDaoImpl.java
 * 文件序号:  序号
 * 内容描述:  文件简单描述，多行换行书写
 * 版权声明:  山东鸿蝶信息技术有限公司
 * 创建用户:  zhangkai
 * 创建日期:  2017/1/17 16:40
 * 修改用户:  无
 * 修改日期:  无
 * 修改说明:  无
 * 文件版本:  V1.0
 * 文件路径:
 */

package com.hongdee.base.basedao.impl;


import com.hongdee.base.basedao.IBaseDao;
import com.hongdee.common.dao.IHibernateDao;
import com.hongdee.common.dao.IJdbcDao;
import com.hongdee.common.util.PoVoUtil;
import com.mysql.jdbc.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 名  称:BaseDaoImpl
 * 类  型: class
 * 描  述: 用一句话描述类的作用
 * 路  径:com.hongdee.base.basedao
 * 作  者:zhangkai
 * 日  期:2017/1/17 16:40
 */
@Service
public class BaseDaoImpl implements IBaseDao {
    /**
     * 注入 jdbcDao
     */
    @Autowired
    private IJdbcDao jdbcDao;
    /**
     * 注入 hibernateDao
     */
    @Autowired
    private IHibernateDao hibernateDao;

    /**
     * @return JdbcDao
     */
    public IJdbcDao getJdbcDao() {
        return jdbcDao;
    }

    /**
     * @return JdbcDao
     */
    public IHibernateDao getHibernateDao() {
        return hibernateDao;
    }

    /**
     * @param start  起始记录
     * @param limit  页面大小
     * @param sqlStr 查询 SQL
     * @param params 参数数组
     * @return Map
     * @throws Exception 异常基类
     * @desc 通过 JDBCDao分页查询
     * @author 张国凯
     * @datetime
     * @chang
     */
    public Map page(String sqlStr, Object[] params, String start, String limit) throws Exception {
        Map res = this.jdbcDao.queryForPageMap(start, limit, sqlStr, params);
        if (null != res && null != res.get("dataList")) {
            res.put("dataList", PoVoUtil.listToVo((List<Map<String, Object>>) res.get("dataList")));
        }
        return res;
    }

    /**
     * @param sql    SQL 语句
     * @param params 查询参数数组
     * @return Map
     * @throws Exception 异常基类
     * @desc 查询详情
     * @author 张国凯
     * @datatime 日期
     * @update_user
     * @update_time
     * @update_desc:
     */
    public Map info(String sql, Object... params) throws Exception {
        return PoVoUtil.mapToVo(this.jdbcDao.queryForMapBySqlWithParams(sql, params));
    }

    /**
     * @param tableName  SQL 语句
     * @param queryKey   查询字段
     * @param queryValue 查询字段值
     * @return Map
     * @throws Exception 异常基类
     * @desc 查询详情
     * @author 张国凯
     * @datatime 日期
     * @update_user
     * @update_time
     * @update_desc:
     */
    public Map info(String tableName, String queryKey, Object queryValue) throws Exception {
        String sqlStr = "select * from " + tableName + " where " + queryKey + " =? ";
        return PoVoUtil.mapToVo(this.jdbcDao.queryForMapBySqlWithParams(sqlStr, queryValue));
    }

    /**
     * @param hql    hql语句
     * @param params hql对应参数
     * @return
     * @throws Exception 异常基类
     * @desc 通过 HQL 执行更新操作
     * @author zhangkai
     * @date 2017/2/8
     * @time 17:08
     * @update_user
     * @update_time
     * @update_desc:
     */
    public void update(String hql, Map<String, Object> params) throws Exception {
        this.hibernateDao.executeHqlWithParams(hql, params);
    }

    /**
     * @param entity @Service 注解标明的实体类
     * @return 更新后的entity @Service 注解标明的实体类
     * @throws Exception 异常基类
     * @desc
     * @author zhangkai
     * @date 2017/2/8
     * @time 17:10
     * @update_user
     * @update_time
     * @update_desc:
     */
    public Object saveOrUpdate(Object entity) throws Exception {
        this.hibernateDao.saveOrUpdateEntity(entity);
        return entity;
    }

    /**
     * @param sqlStr sql 语句
     * @param params 数组类型参数
     * @return List<Map<String, Object>>
     * @throws Exception 异常基类
     * @desc 查询列表
     * @author zhangkai
     * @date 2017/2/8
     * @time 17:20
     * @update_user
     * @update_time
     * @update_desc:
     */
    public List<Map<String, Object>> list(String sqlStr, Object... params) throws Exception {
        return PoVoUtil.listToVo(jdbcDao.queryForMapListBySqlWithParams(sqlStr, params));
    }

    /**
     * @param sqlStr sql 语句
     * @return List<Map<String, Object>>
     * @throws Exception 异常基类
     * @desc 查询列表
     * @author zhangkai
     * @date 2017/2/8
     * @time 17:20
     * @update_user
     * @update_time
     * @update_desc:
     */
    public List<Map<String, Object>> list(String sqlStr) throws Exception {
        return PoVoUtil.listToVo(jdbcDao.queryForMapListBySqlWithParams(sqlStr));
    }

    /**
     * @param entityList @Service标注的实例集合
     * @return void
     * @throws Exception 异常基类
     * @desc 批量保存
     */
    @Override
    public void saveOrUpdateList(List entityList) throws Exception {
        this.hibernateDao.saveOrUpdateEntityList(entityList);
    }

    /**
     * 更新 SQL 语句
     *
     * @param sql
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public int executeSQL(String sql, Object... params) throws Exception {
        return this.jdbcDao.update(sql, params);
    }

    /**
     * 根据表名与关键字段查询 列表
     *
     * @param tableName
     * @param keyColumn
     * @param value
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> listByTableName(String tableName, String keyColumn, Object value) throws Exception {
        if (StringUtils.isNullOrEmpty(tableName)) {
            throw new Exception("表名称不能为空！");
        }
        String sql = "select * from " + tableName + " where 1=1 ";
        List param = new ArrayList();
        if (!StringUtils.isNullOrEmpty(keyColumn)) {
            sql += " and " + keyColumn + " = ? ";
            param.add(value);
        }
        return list(sql, param.toArray());

    }
}
